
#include "mysqlConn.h"
#include <iostream>
// 初始化数据库的连接
MySqlConn::MySqlConn()
{
    m_conn = mysql_init(nullptr);
    mysql_set_character_set(m_conn, "utf8");
}
// 释放数据库的连接
MySqlConn::~MySqlConn()
{
    if (m_conn)
    {
        mysql_close(m_conn);
    }
    freeResult();
}
// 连接数据库
bool MySqlConn::connent(string user, string password, string dbname, string ip, unsigned short port)
{
    MYSQL *ptr = mysql_real_connect(m_conn, ip.c_str(), user.c_str(), password.c_str(), dbname.c_str(), port, nullptr, 0);
    return ptr != nullptr;
}
// 更新数据库
bool MySqlConn::update(string sql)
{
    // 返回0成功
    int n = mysql_query(m_conn, sql.c_str());
    if (n == 0)
    {
        return true;
    }
    else
    {
        return false;
    }
}
// 查询数据库
bool MySqlConn::query(string sql)
{
    freeResult();
    // 返回0成功
    int n = mysql_query(m_conn, sql.c_str());
    if (n != 0)
    {
        return false;
    }

    m_result = mysql_store_result(m_conn);
    return true;
}
// 遍历查询到的结果集
bool MySqlConn::next()
{
    if (m_result != nullptr)
    {
        m_row = mysql_fetch_row(m_result);
        // 等下gdb调试
        if(m_row != nullptr)
        {
            return true;
        }
        
    }
    return false;
}
// 得到结果集的字段值
string MySqlConn::value(int index)
{
    int filedCount = mysql_num_fields(m_result);
    if (index >= filedCount || index < 0)
    {
        return string();
    }
    char *val = m_row[index];
    // 这里有一个问题是假设是一段二进制数据 中间由0的话，直接用string 构造会之构造一部分 ，解决办法会去长度
    // 获取这个字段的长度
    unsigned long length = mysql_fetch_lengths(m_result)[index];
    return string(val, length);
}

// 实务操作
bool MySqlConn::transaction()
{
    return mysql_autocommit(m_conn, false);
}
bool MySqlConn::commit()
{
    return mysql_commit(m_conn);
}
bool MySqlConn::rollback()
{
    return mysql_rollback(m_conn);
}

void MySqlConn::freeResult()
{
    if (m_result)
    {
        mysql_free_result(m_result);
    }
}

// 刷新起始的空闲时间点
void MySqlConn::refreshAliveTime()
{
    m_alivetime = steady_clock::now();
}
// 计算连接存活总时间
long long MySqlConn::getAlieveTime()
{
    nanoseconds res = steady_clock::now()-m_alivetime;
    // 纳秒转换为毫秒
    milliseconds millsec = duration_cast<milliseconds>(res);

    return millsec.count();
}

// 写一个冒泡排序
